/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.bodylimit.dao;

import br.com.bodylimit.model.Funcionario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Allan
 */
public class FuncionarioDAOPostgres implements FuncionarioDAO
{
    Connection con;


    public FuncionarioDAOPostgres(Connection con)
    {
        this.con = con;
    }


    private List<Funcionario> popular(ResultSet rs) throws SQLException
    {
        List<Funcionario> funcionarios = new ArrayList<Funcionario>(0);
        
        while (rs.next())
        {
            Funcionario funcionario = this.popularUm(rs);

            funcionarios.add(funcionario);
        }
        return funcionarios;
    }


    public Funcionario popularUm(ResultSet rs) throws SQLException {
        Funcionario funcionario = new Funcionario();

        //Atribuindo valoles
        funcionario.setMatricula(rs.getInt("matFunc"));
        funcionario.setNome(rs.getString("nomeFunc"));
        return funcionario;
    }

    public Funcionario obter(int matricula) throws SQLException
    {
        String sql = "SELECT * FROM funcionario WHERE matFunc = ?";
        ResultSet rs;
        List<Funcionario> funcionarios;
        PreparedStatement stmt = con.prepareStatement(sql);


        stmt.setInt(1, matricula);
        rs = stmt.executeQuery();


        funcionarios = popular(rs);

        rs.close();
        stmt.close();

        return funcionarios.isEmpty() ? null : funcionarios.get(0);
    }

    public List<Funcionario> listarPorNome(String nome) throws SQLException
    {
        String sql = "SELECT * FROM funcionario WHERE nome LIKE ?";
        ResultSet rs;
        List<Funcionario> funcionarios;
        PreparedStatement stmt = con.prepareStatement(sql);


        stmt.setString(1, nome);
        rs = stmt.executeQuery();


        funcionarios = popular(rs);

        rs.close();
        stmt.close();

        return funcionarios;
    }

    public List<Funcionario> listar() throws SQLException
    {
        String sql = "SELECT * FROM funcionario";
        ResultSet rs;
        List<Funcionario> funcionarios;
        PreparedStatement stmt = con.prepareStatement(sql);

        rs = stmt.executeQuery();


        funcionarios = popular(rs);

        rs.close();
        stmt.close();

        return funcionarios;
    }

    public void adcionar(Funcionario funcionario) throws SQLException
    {
        con.setAutoCommit(false);
        ResultSet rs;
        String sql = "INSERT INTO funcionario(nome) values(?)";

        PreparedStatement stmt = con.prepareStatement(sql);

        stmt.setString(1, funcionario.getNome());
        stmt.executeUpdate();
        
        stmt.close();
        con.commit();


        //Obtendo nova matricula
        stmt = con.prepareStatement("SELECT currval FROM currval(\'funcionario_matFunc_seq\')");
        rs = stmt.executeQuery();

        if(rs.next()) {
            funcionario.setMatricula(rs.getInt("currval"));
        }
        rs.close();
        stmt.close();
        
        con.commit();
    }

    /**
     * Atualiza os dados do funcionario na base.
     * @param funcionario
     * @return
     * @throws SQLException
     */
    public boolean atualizar(Funcionario funcionario) throws SQLException
    {
        if(funcionario.getMatricula() == 0)
        {
            return false;
        }

        String sql = "UPDATE funcionario SET nome = ? WHERE matFunc = ?";

        PreparedStatement stmt = con.prepareStatement(sql);

        stmt.setString(1, funcionario.getNome());
        stmt.setInt(2, funcionario.getMatricula());

        stmt.executeUpdate();

        stmt.close();

        return true;
    }

    public void remover(int matricula) throws SQLException
    {
        String sql = "DELETE FROM funcionario WHERE matFunc = ?";

        PreparedStatement stmt = con.prepareStatement(sql);

        stmt.setInt(1, matricula);

        stmt.executeUpdate();

        stmt.close();
    }
}
